/*-------------------------------------------------------------------------
 *
 * tablefunc.h
 *				TableFunc执行节点的接口
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/executor/tablefunc.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef _TABLEFUNC_H
#define _TABLEFUNC_H

/* 前向声明，以避免在此处包含 execnodes.h */
struct TableFuncScanState;

/*
 * TableFuncRoutine 包含用于生成表生成函数内容的函数指针，例如 XMLTABLE。
 *
 * InitOpaque 初始化表构建器私有对象。输出元组描述符、列的输入函数和 typioparams 从执行器状态传递。
 *
 * SetDocument 被调用以定义输入文档。表构建器可以应用未在表构建器上下文外部暴露的附加转换。
 *
 * SetNamespace 被调用以传递来自表表达式的命名空间声明。如果表构建器不支持命名空间，则此函数可以为 NULL。必须在设置行和列过滤器之前给出命名空间。如果名称为 NULL，则条目应为默认命名空间。
 *
 * SetRowFilter 被调用以定义行生成过滤器，该过滤器将用于从输入文档中提取每一行。
 *
 * SetColumnFilter 被调用一次以定义给定列的列生成过滤器。
 *
 * FetchRow 必须被反复调用，直到返回文档中没有更多行被找到。每次调用必须在表构建器上下文中设置状态，以便每个后续的 GetValue 调用返回被处理行的指示列的值。
 *
 * DestroyOpaque 必须释放与表构建器上下文相关联的所有资源。它可以被调用，因为所有行都已被消费，或者在处理表表达式时发生错误。
 */
typedef struct TableFuncRoutine
{
	void		(*InitOpaque) (struct TableFuncScanState *state, int natts);
	void		(*SetDocument) (struct TableFuncScanState *state, Datum value);
	void		(*SetNamespace) (struct TableFuncScanState *state, const char *name,
								 const char *uri);
	void		(*SetRowFilter) (struct TableFuncScanState *state, const char *path);
	void		(*SetColumnFilter) (struct TableFuncScanState *state,
									const char *path, int colnum);
	bool		(*FetchRow) (struct TableFuncScanState *state);
	Datum		(*GetValue) (struct TableFuncScanState *state, int colnum,
							 Oid typid, int32 typmod, bool *isnull);
	void		(*DestroyOpaque) (struct TableFuncScanState *state);
} TableFuncRoutine;

#endif							/* _TABLEFUNC_H */
